package main

import "fmt"

func lengthOfLongestSubstring(s string) int {
	if len(s) == 0 {
		return 0
	}
	// 位图
	var freq [127]int
	result, left, right := 0, 0, -1
	for left < len(s) {
		// s[right+1] 返回是字符串的 ASCII 码， freq[s[right+1]] == 0 表示该字符没有出现过
		if right+1 < len(s) && freq[s[right+1]] == 0 {
			// freq[s[right+1]]++ 表示该字符出现过
			freq[s[right+1]]++
			// right++ 表示右指针向右移动一位
			right++
		} else { // freq[s[right+1]] != 0 表示该字符出现过
			// freq[s[left]]-- 清空该字符出现过的标记
			freq[s[left]]--
			// left++ 表示左指针向右移动一位
			left++
		}
		// right-left+1 表示当前无重复子串的长度
		// result 表示当前无重复子串的最大长度
		result = max(result, right-left+1)
	}

	return result
}

// 基本思路：使用左右指针和位图来判断是否有重复字符
// 1. 遍历字符串，将字符串中的字符作为位图的下标，将字符串中的字符作为位图的值
// 2. 如果位图的值为 0，表示该字符没有出现过，将位图的值加 1
// 3. 如果位图的值不为 0，表示该字符出现过，将左指针向右移动一位
// 4. 右指针向右移动一位
// 5. 计算当前无重复子串的长度
// 6. 计算当前无重复子串的最大长度
// 7. 返回当前无重复子串的最大长度
func main() {
	s := "a"
	l := lengthOfLongestSubstring(s)
	fmt.Println(l)
}
